package types

import (
	"context"
	"time"
)

// ModelProvider AI模型提供商枚举
type ModelProvider string

const (
	ProviderOpenAI    ModelProvider = "openai"
	ProviderAnthropic ModelProvider = "anthropic"
	ProviderOllama    ModelProvider = "ollama"
	ProviderLocal     ModelProvider = "local"
	ProviderCustom    ModelProvider = "custom"
)

// ModelType 模型类型枚举
type ModelType string

const (
	TypeChat       ModelType = "chat"       // 对话模型
	TypeCompletion ModelType = "completion" // 文本补全
	TypeEmbedding  ModelType = "embedding"  // 向量嵌入
	TypeImage      ModelType = "image"      // 图像生成
	TypeCode       ModelType = "code"       // 代码生成
)

// ChatMessage 对话消息结构
type ChatMessage struct {
	Role    string `json:"role"`    // system, user, assistant
	Content string `json:"content"` // 消息内容
}

// ChatRequest 对话请求结构
type ChatRequest struct {
	Messages         []ChatMessage          `json:"messages"`
	Model            string                 `json:"model,omitempty"`
	Temperature      *float32               `json:"temperature,omitempty"`
	MaxTokens        *int                   `json:"max_tokens,omitempty"`
	TopP             *float32               `json:"top_p,omitempty"`
	FrequencyPenalty *float32               `json:"frequency_penalty,omitempty"`
	PresencePenalty  *float32               `json:"presence_penalty,omitempty"`
	Stop             []string               `json:"stop,omitempty"`
	Stream           bool                   `json:"stream,omitempty"`
	Tools            []Tool                 `json:"tools,omitempty"`
	ToolChoice       interface{}            `json:"tool_choice,omitempty"`
	Metadata         map[string]interface{} `json:"metadata,omitempty"`
}

// ChatResponse 对话响应结构
type ChatResponse struct {
	ID                string   `json:"id"`
	Object            string   `json:"object"`
	Created           int64    `json:"created"`
	Model             string   `json:"model"`
	Choices           []Choice `json:"choices"`
	Usage             Usage    `json:"usage"`
	SystemFingerprint string   `json:"system_fingerprint,omitempty"`
}

// Choice 选择结构
type Choice struct {
	Index        int          `json:"index"`
	Message      ChatMessage  `json:"message"`
	FinishReason string       `json:"finish_reason"`
	Delta        *ChatMessage `json:"delta,omitempty"` // 流式响应用
}

// Usage 使用量统计
type Usage struct {
	PromptTokens     int `json:"prompt_tokens"`
	CompletionTokens int `json:"completion_tokens"`
	TotalTokens      int `json:"total_tokens"`
}

// Tool 工具定义
type Tool struct {
	Type     string   `json:"type"`
	Function Function `json:"function"`
}

// Function 函数定义
type Function struct {
	Name        string      `json:"name"`
	Description string      `json:"description"`
	Parameters  interface{} `json:"parameters"`
}

// EmbeddingRequest 向量嵌入请求
type EmbeddingRequest struct {
	Input          interface{} `json:"input"` // 文本或文本数组
	Model          string      `json:"model"`
	EncodingFormat string      `json:"encoding_format,omitempty"`
	Dimensions     *int        `json:"dimensions,omitempty"`
	User           string      `json:"user,omitempty"`
}

// EmbeddingResponse 向量嵌入响应
type EmbeddingResponse struct {
	Object string      `json:"object"`
	Data   []Embedding `json:"data"`
	Model  string      `json:"model"`
	Usage  Usage       `json:"usage"`
}

// Embedding 向量数据
type Embedding struct {
	Object    string    `json:"object"`
	Index     int       `json:"index"`
	Embedding []float64 `json:"embedding"`
}

// ModelInfo 模型信息
type ModelInfo struct {
	ID          string                 `json:"id"`
	Provider    ModelProvider          `json:"provider"`
	Type        ModelType              `json:"type"`
	Name        string                 `json:"name"`
	Description string                 `json:"description"`
	MaxTokens   int                    `json:"max_tokens"`
	InputPrice  float64                `json:"input_price"`  // 每1K tokens价格
	OutputPrice float64                `json:"output_price"` // 每1K tokens价格
	Features    []string               `json:"features"`     // 支持的功能
	CreatedAt   time.Time              `json:"created_at"`
	UpdatedAt   time.Time              `json:"updated_at"`
	Metadata    map[string]interface{} `json:"metadata"`
}

// AIModel AI模型接口
type AIModel interface {
	// 基础信息
	GetModelInfo() ModelInfo
	GetProvider() ModelProvider
	GetType() ModelType

	// 健康检查
	Health(ctx context.Context) error

	// 对话能力
	Chat(ctx context.Context, req ChatRequest) (*ChatResponse, error)
	ChatStream(ctx context.Context, req ChatRequest) (<-chan ChatResponse, error)

	// 向量嵌入
	Embedding(ctx context.Context, req EmbeddingRequest) (*EmbeddingResponse, error)

	// 工具调用
	CallTool(ctx context.Context, toolName string, params map[string]interface{}) (interface{}, error)

	// 配置管理
	UpdateConfig(config map[string]interface{}) error
	GetConfig() map[string]interface{}
}

// ModelManager 模型管理器接口
type ModelManager interface {
	// 模型注册
	RegisterModel(model AIModel) error
	UnregisterModel(modelID string) error

	// 模型获取
	GetModel(modelID string) (AIModel, error)
	GetModelsByProvider(provider ModelProvider) ([]AIModel, error)
	GetModelsByType(modelType ModelType) ([]AIModel, error)
	ListModels() ([]ModelInfo, error)

	// 负载均衡
	GetBestModel(criteria ModelSelectionCriteria) (AIModel, error)

	// 健康检查
	HealthCheck(ctx context.Context) (map[string]error, error)
}

// ModelSelectionCriteria 模型选择标准
type ModelSelectionCriteria struct {
	Provider    *ModelProvider `json:"provider,omitempty"`
	Type        *ModelType     `json:"type,omitempty"`
	MaxTokens   *int           `json:"max_tokens,omitempty"`
	MaxCost     *float64       `json:"max_cost,omitempty"`
	Features    []string       `json:"features,omitempty"`
	Performance *string        `json:"performance,omitempty"` // fast, balanced, quality
}

// StreamResponse 流式响应接口
type StreamResponse interface {
	Recv() (*ChatResponse, error) // 接收响应
	Close() error                 // 关闭连接
}
